# numpy_structures.py
# numpy的基本数据结构

import numpy as np

# 对于np.array来说，里面的数据类型必须是相同的
# 如果是不同类型，numpy会自动进行类型转换，自动向下兼容
print("numpy的基本数据结构")
list_data = [1, 2, 3, 4, 5.0] # 这里面有int和float
array = np.array(list_data)     
print(array) # 结果是 [1. 2. 3. 4. 5.]  全部变成了float类型

list_data1 = [1, 2, 3, 4, "5"] # 这里面有int和float
array1 = np.array(list_data1)     
print(array1) # 结果是 ['1' '2' '3' '4' '5']  全部变成了str类型

print('')

#np.array的基础属性
print("np.array的基础属性")
print(type(array)) # <class 'numpy.ndarray'> # numpy的数组类型是ndarray
print(array.dtype) # float64  表示数据类型是float64  #原数据是int类型，但是被自动转换成了float64
print(array.itemsize)  # 8  表示每个元素的字节数
print(array.shape) # (5,)  表示5行1列
print(array.size)  # 5  表示元素的个数
print(array.ndim)  # 1  表示数组的维度  一维

array.fill(5)
print(array) # None  fill函数没有返回值  只是把array的每个元素都变成了5

array = np.array(list_data)     # 重新赋值

print('')

# 索引与切片
# np.array的多维数组  跟python的list类似 还是从0 开始
print("索引与切片")
print(array[0]) # 1.0  索引第一个元素
print(array[1:3]) # [2. 3.]  切片  包含第1个元素，不包含第3个元素   
print(array[-1:]) # [5.]  切片  包含最后一个元素

print('')

#多维矩阵形式
print("多维矩阵形式")
Multi_matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(Multi_matrix)
print(Multi_matrix.shape) # (3, 3)  表示3行3列
print(Multi_matrix.size)  # 9  表示数组的元素个数
print(Multi_matrix.ndim)  # 2  表示二维数组 这里面是一个平面矩阵 三维的话 多一个[]
print(Multi_matrix[1, 1]) # 5  索引第二行第二列的元素
Multi_matrix[1, 1] = 10 # 修改第二行第二列的元素
print(Multi_matrix) # [[ 1  2  3] [ 4 10  6] [ 7  8  9]] 修改了第二行第二列的元素
print(Multi_matrix[1]) # [ 4 10  6]  索引第二行的所有元素    [1]
print(Multi_matrix[:, 1]) # [ 2 10  8]  索引第二列的所有元素 [:, 1]

print('')


# 数组的复制
# 如果直接赋值，会指向同一个数组
print("数组的复制")
Multi_matrix_2 = Multi_matrix
Multi_matrix_2[0, 0] = 100 # 修改第一个元素
print(Multi_matrix) # [[100  2  3] [ 4 10  6] [ 7  8  9]] 修改了第一个元素
print(Multi_matrix_2) # [[100  2  3] [ 4 10  6] [ 7  8  9]] 修改了第一个元素
# 注意：如果想要复制一个数组，不能直接赋值，因为这样只是引用了同一个数组   就好像是指向同一个数组

print('')

# copy函数
# 如果想要复制一个数组，需要使用copy函数  这个方法不会指向同一个数组
print("copy函数复制数组")
Multi_matrix_3 = Multi_matrix.copy() # 复制一个数组
Multi_matrix_3[0, 0] = 200 # 修改第一个元素
print(Multi_matrix) # [[100  2  3] [ 4 10  6] [ 7  8  9]] 修改了第一个元素
print(Multi_matrix_3) # [[200  2  3] [ 4 10  6] [ 7  8  9]] 修改了第一个元素 

print('')


# np.arange() 生成一个等差数列的数组
print("np.arange() 生成一个等差数列的数组")
score_step = np.arange(0, 100, 10) # 生成一个从0到100，步长为10的数组
print(score_step) # [ 0 10 20 30 40 50 60 70 80 90]  包含0

mask = np.array([0, 0, 0, 0, 0, 0, 1, 1, 1, 1], dtype=bool) # 生成一个布尔数组
print(mask) # [False False False False False False  True  True  True  True]  布尔数组

print(score_step[mask]) # [60 70 80 90]  使用布尔数组进行索引，返回True对应的元素


print('')

# np.random.rand() 生成一个随机浮点数数组
print("np.random.rand() 生成一个随机浮点数数组")
random_array = np.random.rand(10) # 生成一个10个元素的随机浮点数数组
print(random_array)

mask1 = random_array > 0.5 # 生成一个布尔数组 根据索引的大小生成随机的mask1数组
score_step1 = np.arange(0, 100, 10) # 生成一个从0到1，步长为0.1的数组
print(mask1) 
print(score_step1[mask1])
score_step2 = np.where(score_step1[mask1] > 30)
print("返回大于30"+" "+ f"{score_step2}") 


array_random_01 = np.array([1,2,3,4,5],dtype=np.float32)
print(array_random_01)  # 转化这个np.array其中的类型为float32

array_random_02 = np.array([1,2,3,4,"5"],dtype=np.object_)
print(array_random_02)  # 转化这个np.array其中的类型为object（str字符串）

array_random_03 = np.array([1,2,3,4,5])
print(array_random_03.astype(np.float32)) # 把数组中的元素类型转化为float32



